{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# DQN - Deep Q-Network  (PyTorch) - Play Atari game.\n",
    "\n",
    "In this notebook, we will use DQN with **experience replay** and **target networks** from `listing6_1` to train the agent to play Atari game. Most of the implementation will be same as previous one except some pre-processing to make Atari game playing trainable with DQN. \n",
    "\n",
    "The deep learning approach combined with Q-Learinng and word `DQN` was coined in this paper. We have tried to broadly follow the steps of the paper in this notebook\n",
    "\n",
    "Paper: [Playing Atari with Deep Reinforcement Learning](https://arxiv.org/pdf/1312.5602.pdf)\n",
    "\n",
    "### Recap from last notebook\n",
    "\n",
    "$$ \n",
    "\\DeclareMathOperator*{\\max}{max}$$\n",
    "\n",
    "Q Learning control is carried out by sampling step by step and updating Q values at each step. We use ε-greedy policy to explore and generate samples. However, the policy learnt is a deterministic greedy policy with no exploration. We can carryout updates online i.e. we take a step and use `(current state, action, reward and next_state)` tuple to update. \n",
    "\n",
    "In case of function approximation using neural network, the input to the network is the state and output is the q(s,a) for all the actions in the state `s`. It is denoted as $ \\hat{q}(s_t,a; w_{t}) $, where $w_{t}$ is the weigths of the neural network which we are trying to learn as part of DQN learning. \n",
    "\n",
    "We use two networks, one target network to get the max q-value of next state denoted by $ \\max_a \\hat {q}(s_{t+1},a; w^{-}_{t}) $ and the primary network with weights $w_{t}$ which we are updated based on back propagation of the TD error through the network.\n",
    "\n",
    "The Update equation is given below. This is the online version:\n",
    "$$ w_{t+1} \\leftarrow w_t + \\alpha [ R_{t+1} + \\gamma . \\max_{a} \\hat{q}(S_{t+1},a,w^{-}_{t}) – \\hat{q}(S_t,A_t,w_t)] \\nabla \\hat{q}(S_t,A_t,w_t)$$\n",
    "\n",
    "Online update with neural network with millions of weights does not work well. Accordingly, We use experience replay (aka Replay Buffer).  We use a behavior policy to explore the environment and store the samples `(s, a, r, s', done)` in a buffer. The samples are generated using an exploratory behavior policy while we improve a deterministic target policy using q-values. \n",
    "\n",
    "Therefore, we can always use older samples from behavior policy and apply them again and again. We can keep the buffer size fixed to some pre-determined size and keep deleting the older samples as we collect new ones. This process makes learning sample efficient by reusing a sample multiple times and also removing temporal dependence of the samples we would otherwise see while following a trajectory.\n",
    "\n",
    "The update equation with batch update with minor modifications is given below. We collect samples of transitions (current state, action, reward, next state) in a buffer. Where each sample is denoted as a tuple: \n",
    "\n",
    "$$ (s_{i}, a_{i}, r_{i}, s^{'}_{i}, done_{i})$$\n",
    "\n",
    "Subscript (i) denotes ith sample. We take N samples from experience replay selecting randomly and update the weights. Subscript (t) denotes the index of weight updates. If the current state is done, as denoted by `done` flag, the target is just the reward as terminal states have zero value. The final update equation is as given below:\n",
    "\n",
    "$$w_{t+1} \\leftarrow w_t + \\alpha \\frac{1}{N} \\sum_{i=1}^{N} \\left[ r_i + \\left( (1-done_i) . \\gamma .  \\max_{a^{'}} \\hat{q}(s_{i}^{'},a^{'};w^{-}_{t}) \\right) – \\hat{q}(s_i,a_i;w_t) \\right] \\nabla \\hat{q}(s_i,a_i;w_t)$$\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import gym\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.signal import convolve, gaussian\n",
    "\n",
    "import os\n",
    "import io\n",
    "import base64\n",
    "import time\n",
    "import glob\n",
    "from IPython.display import HTML\n",
    "\n",
    "%matplotlib inline\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Environment - Atari Breakout \n",
    "\n",
    "We can use the setup here to run on any environment which has state as a single vector and actions are discrete. We will build it on Atari Breakout.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_env(env_name, seed=None):\n",
    "    # remove time limit wrapper from environment\n",
    "    env = gym.make(env_name).unwrapped\n",
    "    if seed is not None:\n",
    "        env.seed(seed)\n",
    "    return env"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x648 with 8 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "env_name = \"BreakoutNoFrameskip-v4\"\n",
    "\n",
    "env = make_env(env_name)\n",
    "env.reset()\n",
    "\n",
    "\n",
    "\n",
    "n_cols = 4\n",
    "n_rows = 2\n",
    "fig = plt.figure(figsize=(16, 9))\n",
    "\n",
    "for row in range(n_rows):\n",
    "    for col in range(n_cols):\n",
    "        ax = fig.add_subplot(n_rows, n_cols, row * n_cols + col + 1)\n",
    "        ax.imshow(env.render('rgb_array'))\n",
    "        env.step(env.action_space.sample())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### We can play the game\n",
    "\n",
    "use `A` and `D` on keyboard to move the bat and `Space-bar` to start. use `Esc` to kill the game. \n",
    "\n",
    "**NOTE: Running the cell below may crash your kernel in Mac. If you face that problem, please comment the cell below or do not run it**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pygame 1.9.6\n",
      "Hello from the pygame community. https://www.pygame.org/contribute.html\n",
      "(320, 420)\n"
     ]
    }
   ],
   "source": [
    "from gym.utils.play import play\n",
    "\n",
    "play(env=gym.make(env_name), zoom=2, fps=30)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pre processing\n",
    "\n",
    "Atari images are 210x160x3 pixels but we will scale it down and also convert to gray-scale to reduce the size and make the game learn faster from smaller image sizes. We will also stack 4 last frames as input observation. This is done to capture the motion of the ball and bat which would not be visible in a single frame of game. OpenAI Gym library has ObservationWrappers to provide all these pre-processing out of the box. We will also be clipping rewards with just the sign of rewards. This is following the approach outlined in original paper. Let us build our preprocessor below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from gym.wrappers import AtariPreprocessing\n",
    "from gym.wrappers import FrameStack\n",
    "from gym.wrappers import TransformReward\n",
    "\n",
    "def make_env(env_name, clip_rewards=True, seed=None):\n",
    "    env = gym.make(env_name)\n",
    "    if seed is not None:\n",
    "        env.seed(seed)\n",
    "    env = AtariPreprocessing(env, screen_size=84, scale_obs=True)\n",
    "    env = FrameStack(env, num_stack=4)\n",
    "    if clip_rewards:\n",
    "        env = TransformReward(env, lambda r: np.sign(r))\n",
    "    return env\n",
    "\n",
    "env = make_env(env_name)\n",
    "env.reset()\n",
    "n_actions = env.action_space.n\n",
    "state_shape = env.observation_space.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['NOOP', 'FIRE', 'RIGHT', 'LEFT']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n_actions\n",
    "env.get_action_meanings()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 804, in callit\n",
      "    func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x0000022A7F491880>\n",
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 242, in resize\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x0000022A7F748070>\n",
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 804, in callit\n",
      "    func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x0000022A7F748070>\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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JpNhZmZGFUtpS57nkUgkMDOy2WxD61uFQoG5uTnS6TSzs7OapiJtycyCfWvn5+cb0hjecsGZPwnbb/nXOH9pV4VCgWKxSKlUavicMH+RBD8fqedM2pHneRQKhSAPNbJiWS6Xl5RDjWxAEWkVlUolKIcavbCOPxKq/kekHfnXd6MWMdRS+iIiIiIiIi1gzcGZmYXN7Htm9me1231m9qCZvVL73du8ZIqIiIiIiLS3S+k5+3nghbrbnwIecs4dBB6q3RYREREREZHLsKbgzMz2AD8E/Pe6u+8G7q/9fT9wT0NTJiIiIiIiso2stefsPwK/BNSvWrDTOXceoPZ7x3L/aGb3mdlxMzuuPctERERERESWt2pwZmYfBMadc09ezgs45z7rnDvmnDs2MDBwOYcQERERERFpe2tZSv9dwIfM7AeBONBlZv8LGDOzXc6582a2CxhvZkJFRERERETa2ao9Z865f+6c2+Ocuwr4GPCXzrlPAF8F7q097V7gK01LpYiIiIiISJtbzz5nnwbeb2avAO+v3RYREREREZHLsJZhjQHn3MPAw7W/p4A7Gp8kERERERGR7Wc9PWciIiIiIiLSIArOREREREREWoCCMxERERERkRag4ExERERERKQFKDgTERERERFpAQrOREREREREWoCCMxERERERkRag4ExERERERKQFKDgTERERERFpAQrOREREREREWoCCMxERERERkRag4ExERERERKQFKDgTERERERFpAQrOREREREREWoCCMxERERERkRag4ExERERERKQFeGt5kpmdAuaAMlByzh0zsz7gD4GrgFPAR51zM81JpoiIiIiISHu7lJ6z73fOHXXOHavd/hTwkHPuIPBQ7baIiIiIiIhchvUMa7wbuL/29/3APetOjYiIiIiIyDa11uDMAd80syfN7L7afTudc+cBar93LPePZnafmR03s+OTk5PrT7GIiIiIiEgbWtOcM+BdzrlzZrYDeNDMXlzrCzjnPgt8FuDmm292l5FGERERERGRtremnjPn3Lna73Hgy8AtwJiZ7QKo/R5vViJFRERERETa3arBmZmlzKzT/xu4E3gW+Cpwb+1p9wJfaVYiRURERERE2t1ahjXuBL5sZv7z/8A59w0zewL4gpl9EjgNfKR5yRQREREREWlvqwZnzrnXgLctc/8UcEczEiUiIiIiIrLd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\n",
      "text/plain": [
       "<Figure size 1080x661 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for _ in range(12):\n",
    "    obs, _, _, _ = env.step(env.action_space.sample())\n",
    "\n",
    "plt.figure(figsize=[12,10])\n",
    "plt.title(\"Game image\")\n",
    "plt.imshow(env.render(\"rgb_array\"))\n",
    "plt.show()\n",
    "\n",
    "obs = obs[:] #unpack lazyframe\n",
    "obs = np.transpose(obs,[1,0,2]) #move axes\n",
    "obs = obs.reshape((obs.shape[0], -1))\n",
    "\n",
    "\n",
    "plt.figure(figsize=[15,15])\n",
    "plt.title(\"Agent observation (4 frames left to right)\")\n",
    "plt.imshow(obs, cmap='gray')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Building a network using pytorch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let us build a DQN agent using the architecture suggested in paper.\n",
    "\n",
    "    Observation:\n",
    "        pytorch 4x84x84 pytroch has channels in the first dimension\n",
    "        input: [batch_size, 4, 84, 84]\n",
    "        1st hidden layer: 16 8x8 filters with stride 4 and RelU activation\n",
    "        2nd hidden layer: 32 4x4 filters with stride of 2 and RelU activation\n",
    "        3nd hidden layer: Linear layer with 256 outputs and RelU activatrion\n",
    "        output layer: Linear with n_actions units with no activation\n",
    "\n",
    "To build this network, after 2 layers of convolution, we will flatten the layers. To connect this to Dense(Linear) layer, we need to calculate the number of units entering dense layer. We do so using the formula for Conv2D output.\n",
    "\n",
    "`out_dim = (in_dim - (kernel_size - 1) - 1) // stride  + 1`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def conv2d_size_out(size, kernel_size, stride):\n",
    "    return (size - (kernel_size - 1) - 1) // stride  + 1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conv1:  20\n",
      "Conv1:  9\n",
      "Input to Dense layer: 2592\n"
     ]
    }
   ],
   "source": [
    "# for the network above\n",
    "# 1st Conv layer output size\n",
    "conv1 = conv2d_size_out(84, 8, 4)\n",
    "print('Conv1: ', conv1)\n",
    "conv2 = conv2d_size_out(conv1, 4, 2)\n",
    "print('Conv1: ', conv2)\n",
    "\n",
    "#number of units entering dense layer would be\n",
    "print(\"Input to Dense layer:\", conv2*conv2*32) #32 is number of filters coming out in 2nd conv layer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "device(type='cpu')"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "device"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DQNAgent(nn.Module):\n",
    "    def __init__(self, state_shape, n_actions, epsilon=0):\n",
    "\n",
    "        super().__init__()\n",
    "        self.epsilon = epsilon\n",
    "        self.n_actions = n_actions\n",
    "        self.state_shape = state_shape\n",
    "        \n",
    "        state_dim = state_shape[0]\n",
    "        # a simple NN with state_dim as input vector (inout is state s)\n",
    "        # and self.n_actions as output vector of logits of q(s, a)\n",
    "        self.network = nn.Sequential()\n",
    "        self.network.add_module('conv1', nn.Conv2d(4,16,kernel_size=8, stride=4))\n",
    "        self.network.add_module('relu1', nn.ReLU())\n",
    "        self.network.add_module('conv2', nn.Conv2d(16,32,kernel_size=4, stride=2))\n",
    "        self.network.add_module('relu2', nn.ReLU())\n",
    "        self.network.add_module('flatten', nn.Flatten())\n",
    "        self.network.add_module('linear3', nn.Linear(2592, 256)) #2592 calculated above\n",
    "        self.network.add_module('relu3', nn.ReLU())\n",
    "        self.network.add_module('linear4', nn.Linear(256, n_actions))\n",
    "        \n",
    "        self.parameters = self.network.parameters\n",
    "        \n",
    "    def forward(self, state_t):\n",
    "        # pass the state at time t through the newrok to get Q(s,a)\n",
    "        qvalues = self.network(state_t)\n",
    "        return qvalues\n",
    "\n",
    "    def get_qvalues(self, states):\n",
    "        # input is an array of states in numpy and outout is Qvals as numpy array\n",
    "        states = torch.tensor(states, device=device, dtype=torch.float32)\n",
    "        qvalues = self.forward(states)\n",
    "        return qvalues.data.cpu().numpy()\n",
    "\n",
    "    def sample_actions(self, qvalues):\n",
    "        # sample actions from a batch of q_values using epsilon greedy policy\n",
    "        epsilon = self.epsilon\n",
    "        batch_size, n_actions = qvalues.shape\n",
    "        random_actions = np.random.choice(n_actions, size=batch_size)\n",
    "        best_actions = qvalues.argmax(axis=-1)\n",
    "        should_explore = np.random.choice(\n",
    "            [0, 1], batch_size, p=[1-epsilon, epsilon])\n",
    "        return np.where(should_explore, random_actions, best_actions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "agent = DQNAgent(state_shape, n_actions, epsilon=0.5).to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate(env, agent, n_games=1, greedy=False, t_max=10000):\n",
    "    rewards = []\n",
    "    for _ in range(n_games):\n",
    "        s = env.reset()\n",
    "        reward = 0\n",
    "        for _ in range(t_max):\n",
    "            qvalues = agent.get_qvalues([s])\n",
    "            action = qvalues.argmax(axis=-1)[0] if greedy else agent.sample_actions(qvalues)[0]\n",
    "            s, r, done, _ = env.step(action)\n",
    "            reward += r\n",
    "            if done:\n",
    "                break\n",
    "\n",
    "        rewards.append(reward)\n",
    "    return np.mean(rewards)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluate(env, agent, n_games=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "env.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Experience replay\n",
    "\n",
    "We will use the replay buffer we saw in chapter 4 listings. Replay buffer is very important in DQN to break the correlation between samples. We use a behavior policy ($\\epsilon-greedy$) to sample from the environment and store the transitions (s,a,r,s',done) into a buffer. These samples are used multiple times in a learning making the process sample efficient. \n",
    "\n",
    "The interface to ReplayBuffer is:\n",
    "* `exp_replay.add(state, action, reward, next_state, done)` - saves (s,a,r,s',done) tuple into the buffer\n",
    "* `exp_replay.sample(batch_size)` - returns states, actions, rewards, next_states and done_flags for `batch_size` random samples.\n",
    "* `len(exp_replay)` - returns number of elements stored in replay buffer.\n",
    "\n",
    "We have modified the implementation a bit to make it more efficient"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "class ReplayBuffer:\n",
    "    def __init__(self, size):\n",
    "        self.size = size #max number of items in buffer\n",
    "        self.buffer =[] #array to holde buffer\n",
    "        self.next_id = 0\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.buffer)\n",
    "    \n",
    "    def add(self, state, action, reward, next_state, done):\n",
    "        item = (state, action, reward, next_state, done)\n",
    "        if len(self.buffer) < self.size:\n",
    "           self.buffer.append(item)\n",
    "        else:\n",
    "            self.buffer[self.next_id] = item\n",
    "        self.next_id = (self.next_id + 1) % self.size\n",
    "        \n",
    "    def sample(self, batch_size):\n",
    "        idxs = np.random.choice(len(self.buffer), batch_size)\n",
    "        samples = [self.buffer[i] for i in idxs]\n",
    "        states, actions, rewards, next_states, done_flags = list(zip(*samples))\n",
    "        return np.array(states), np.array(actions), np.array(rewards), np.array(next_states), np.array(done_flags)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def play_and_record(start_state, agent, env, exp_replay, n_steps=1):\n",
    "\n",
    "    s = start_state\n",
    "    sum_rewards = 0\n",
    "\n",
    "    # Play the game for n_steps and record transitions in buffer\n",
    "    for _ in range(n_steps):\n",
    "        qvalues = agent.get_qvalues([s])\n",
    "        a = agent.sample_actions(qvalues)[0]        \n",
    "        next_s, r, done, _ = env.step(a)\n",
    "        sum_rewards += r\n",
    "        exp_replay.add(s, a, r, next_s, done)\n",
    "        if done:\n",
    "            s = env.reset()\n",
    "        else:\n",
    "            s = next_s\n",
    "        \n",
    "    return sum_rewards, s"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Target network\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<All keys matched successfully>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "target_network = DQNAgent(agent.state_shape, agent.n_actions, epsilon=0.5).to(device)\n",
    "target_network.load_state_dict(agent.state_dict())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Learning with... Q-learning\n",
    "Here we write a function similar to tabular q-learning. We will calculate average TD error per batch using the equation: \n",
    "\n",
    "$$ L =  \\frac{1}{N} \\sum_{i=1}^{N} \\left[ r_i + \\left( (1-done_i) . \\gamma .  \\max_{a^{'}} \\hat{q}(s_{i}^{'},a^{'};w^{-}_{t}) \\right) – \\hat{q}(s_i,a_i;w_t) \\right]^2$$\n",
    "\n",
    "\n",
    "$$ \\nabla_w L =   - \\frac{1}{N} \\sum_{i=1}^{N} \\left[ r_i + \\left( (1-done_i) . \\gamma .  \\max_{a^{'}} \\hat{q}(s_{i}^{'},a^{'};w^{-}_{t}) \\right) – \\hat{q}(s_i,a_i;w_t) \\right] \\nabla \\hat{q}(s_i,a_i;w_t)$$\n",
    "\n",
    "\n",
    "$\\hat{q}(s',A;w^{-})$ is calculated using target network whose weights are held constant and refreshed periodically from the agent learning network. \n",
    "\n",
    "Target is given by following:\n",
    "* non terminal state: $r_i +  \\gamma .  \\max_{a^{'}} \\hat{q}(s_{i}^{'},a^{'};w^{-}_{t})$\n",
    "* terminal state: $ r_i $\n",
    "\n",
    "We then carryout back propagation through the agent network to update the weights using equation below:\n",
    "\n",
    "\n",
    "$$ \n",
    "\\DeclareMathOperator*{\\max}{max} w_{t+1} \\leftarrow w_t - \\alpha \\nabla_{w}L$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_td_loss(agent, target_network, states, actions, rewards, next_states, done_flags,\n",
    "                    gamma=0.99, device=device):\n",
    "\n",
    "    # convert numpy array to torch tensors\n",
    "    states = torch.tensor(states, device=device, dtype=torch.float)\n",
    "    actions = torch.tensor(actions, device=device, dtype=torch.long)\n",
    "    rewards = torch.tensor(rewards, device=device, dtype=torch.float)\n",
    "    next_states = torch.tensor(next_states, device=device, dtype=torch.float)\n",
    "    done_flags = torch.tensor(done_flags.astype('float32'),device=device,dtype=torch.float)\n",
    "\n",
    "    # get q-values for all actions in current states\n",
    "    # use agent network\n",
    "    predicted_qvalues = agent(states)\n",
    "\n",
    "    # compute q-values for all actions in next states\n",
    "    # use target network\n",
    "    predicted_next_qvalues = target_network(next_states)\n",
    "    \n",
    "    # select q-values for chosen actions\n",
    "    predicted_qvalues_for_actions = predicted_qvalues[range(\n",
    "        len(actions)), actions]\n",
    "\n",
    "    # compute Qmax(next_states, actions) using predicted next q-values\n",
    "    next_state_values,_ = torch.max(predicted_next_qvalues, dim=1)\n",
    "\n",
    "    # compute \"target q-values\" \n",
    "    target_qvalues_for_actions = rewards + gamma * next_state_values * (1-done_flags)\n",
    "\n",
    "    # mean squared error loss to minimize\n",
    "    loss = torch.mean((predicted_qvalues_for_actions -\n",
    "                       target_qvalues_for_actions.detach()) ** 2)\n",
    "\n",
    "    return loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Main loop\n",
    "\n",
    "We now carryout the training on DQN setup above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tqdm import trange\n",
    "from IPython.display import clear_output\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<torch._C.Generator at 0x22a792ac190>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# set a seed\n",
    "seed = 13\n",
    "random.seed(seed)\n",
    "np.random.seed(seed)\n",
    "torch.manual_seed(seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<All keys matched successfully>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#setup env and agent and target networks\n",
    "env = make_env(env_name, seed)\n",
    "state_dim = env.observation_space.shape\n",
    "n_actions = env.action_space.n\n",
    "state = env.reset()\n",
    "\n",
    "agent = DQNAgent(state_dim, n_actions, epsilon=1).to(device)\n",
    "target_network = DQNAgent(state_dim, n_actions, epsilon=1).to(device)\n",
    "target_network.load_state_dict(agent.state_dict())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000\n"
     ]
    }
   ],
   "source": [
    "# let us fill experience replay with some samples using full random policy\n",
    "exp_replay = ReplayBuffer(10**4)\n",
    "for i in range(100):\n",
    "    play_and_record(state, agent, env, exp_replay, n_steps=10**2)\n",
    "    if len(exp_replay) == 10**4:\n",
    "        break\n",
    "print(len(exp_replay))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "#setup some parameters for training\n",
    "timesteps_per_epoch = 1\n",
    "batch_size = 32\n",
    "\n",
    "total_steps = 100\n",
    "# total_steps = 3 * 10**6\n",
    "# We will train only for a sample of 100 steps\n",
    "# To train the full network on a CPU will take hours.\n",
    "# infact even GPU training will be fiarly long\n",
    "# Those who have access to powerful machines with GPU could \n",
    "# try training it over 3-5 million steps or so\n",
    "\n",
    "\n",
    "#init Optimizer\n",
    "opt = torch.optim.Adam(agent.parameters(), lr=1e-4)\n",
    "\n",
    "# set exploration epsilon \n",
    "start_epsilon = 1\n",
    "end_epsilon = 0.05\n",
    "eps_decay_final_step = 1 * 10**6\n",
    "\n",
    "# setup spme frequency for loggind and updating target network\n",
    "loss_freq = 20\n",
    "refresh_target_network_freq = 100\n",
    "eval_freq = 1000\n",
    "\n",
    "# to clip the gradients\n",
    "max_grad_norm = 5000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "mean_rw_history = []\n",
    "td_loss_history = []\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "def epsilon_schedule(start_eps, end_eps, step, final_step):\n",
    "    return start_eps + (end_eps-start_eps)*min(step, final_step)/final_step\n",
    "\n",
    "def smoothen(values):\n",
    "    kernel = gaussian(100, std=100)\n",
    "    kernel = kernel / np.sum(kernel)\n",
    "    return convolve(values, kernel, 'valid')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  1%|▊                                                                                 | 1/101 [00:22<38:13, 22.94s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "buffer size = 10000, epsilon = 1.00000\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████████| 101/101 [00:27<00:00,  3.68it/s]\n",
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 804, in callit\n",
      "    func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x0000022A025828E0>\n",
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 242, in resize\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x0000022A025828E0>\n",
      "Exception in Tkinter callback\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n",
      "    return self.func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\tkinter\\__init__.py\", line 804, in callit\n",
      "    func(*args)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n",
      "    self.draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n",
      "    super(FigureCanvasTkAgg, self).draw()\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n",
      "    self.figure.draw(self.renderer)\n",
      "  File \"C:\\Users\\nsang\\anaconda3\\envs\\apress-test\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n",
      "    def _draw(renderer): raise Done(renderer)\n",
      "matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x0000022A025828E0>\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "state = env.reset()\n",
    "for step in trange(total_steps + 1):\n",
    "    \n",
    "    # reduce exploration as we progress\n",
    "    agent.epsilon = epsilon_schedule(start_epsilon, end_epsilon, step, eps_decay_final_step)\n",
    "\n",
    "    # take timesteps_per_epoch and update experience replay buffer\n",
    "    _, state = play_and_record(state, agent, env, exp_replay, timesteps_per_epoch)\n",
    "\n",
    "    # train by sampling batch_size of data from experience replay\n",
    "    states, actions, rewards, next_states, done_flags = exp_replay.sample(batch_size)\n",
    "    \n",
    "\n",
    "    # loss = <compute TD loss>\n",
    "    loss = compute_td_loss(agent, target_network, \n",
    "                           states, actions, rewards, next_states, done_flags,                  \n",
    "                           gamma=0.99,\n",
    "                           device=device)\n",
    "\n",
    "    loss.backward()\n",
    "    grad_norm = nn.utils.clip_grad_norm_(agent.parameters(), max_grad_norm)\n",
    "    opt.step()\n",
    "    opt.zero_grad()\n",
    "\n",
    "    if step % loss_freq == 0:\n",
    "        td_loss_history.append(loss.data.cpu().item())\n",
    "\n",
    "    if step % refresh_target_network_freq == 0:\n",
    "        # Load agent weights into target_network\n",
    "        target_network.load_state_dict(agent.state_dict())\n",
    "\n",
    "    if step % eval_freq == 0:\n",
    "        # eval the agent\n",
    "        mean_rw_history.append(evaluate(\n",
    "            make_env(env_name, seed=step), agent, n_games=3, greedy=True, t_max=1000)\n",
    "        )\n",
    "\n",
    "        clear_output(True)\n",
    "        print(\"buffer size = %i, epsilon = %.5f\" %\n",
    "              (len(exp_replay), agent.epsilon))\n",
    "\n",
    "        plt.figure(figsize=[16, 5])\n",
    "        plt.subplot(1, 2, 1)\n",
    "        plt.title(\"Mean reward per episode\")\n",
    "        plt.plot(mean_rw_history)\n",
    "        plt.grid()\n",
    "\n",
    "        assert not np.isnan(td_loss_history[-1])\n",
    "        plt.subplot(1, 2, 2)\n",
    "        plt.title(\"TD loss history (smoothened)\")\n",
    "        plt.plot(smoothen(td_loss_history))\n",
    "        plt.grid()\n",
    "\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "final score: 0.0\n"
     ]
    }
   ],
   "source": [
    "final_score = evaluate(\n",
    "  make_env(env_name),\n",
    "  agent, n_games=1, greedy=True, t_max=1000\n",
    ")\n",
    "print('final score:', final_score)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The training for 100 steps will not produce any result. It may be close to 100,000 steps or so before you see any semblance of learning by agent. Do not worry about the exceptions above. That is because the first graph has no data point for 100 steps. First data point for the left graph is generated only at 1000th step."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Let us record a video of trained agent**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_animation(env, agent, save_dir):\n",
    "    \n",
    "    try:\n",
    "        env = gym.wrappers.Monitor(\n",
    "            env, save_dir, video_callable=lambda id: True, force=True, mode='evaluation')\n",
    "    except gym.error.Error as e:\n",
    "        print(e)\n",
    "\n",
    "    if not os.path.exists(save_dir):\n",
    "        os.makedirs(save_dir)\n",
    "        \n",
    "    state = env.reset()\n",
    "    reward = 0\n",
    "    t = 0\n",
    "    while True:\n",
    "        qvalues = agent.get_qvalues([state])\n",
    "        action = qvalues.argmax(axis=-1)[0]\n",
    "        state, r, done, _ = env.step(action)\n",
    "        reward += r\n",
    "        t += 1\n",
    "        if done  or t >= 1000:\n",
    "            print('Got reward: {}'.format(reward))\n",
    "            break\n",
    "            \n",
    "def display_animation(filepath):\n",
    "    video = io.open(filepath, 'r+b').read()\n",
    "    encoded = base64.b64encode(video)\n",
    "    return HTML(data='''<video alt=\"test\" controls>\n",
    "                <source src=\"data:video/mp4;base64,{0}\" type=\"video/mp4\" />\n",
    "                 </video>'''.format(encoded.decode('ascii')))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Got reward: 0.0\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<video alt=\"test\" controls>\n",
       "                <source src=\"data:video/mp4;base64,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AAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAIAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAIAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAIAAAQAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAEAAAoAAAAAAQAABAAAAAABAAAAAAAAAAEAAAIAAAAAAQAACgAAAAABAAAEAAAAAAEAAAAAAAAAAQAAAgAAAAABAAAKAAAAAAEAAAQAAAAAAQAAAAAAAAABAAACAAAAAAIAAAQAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAPpAAAAAQAAD7hzdHN6AAAAAAAAAAAAAAPpAAAErAAAAGgAAAA5AAAAGQAAABIAAAAkAAAAGwAAABgAAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFgAAABEAAAAPAAAADwAAABYAAAARAAAADwAAAA8AAAAWAAAAEQAAAA8AAAAPAAAAFQAAAdkAAAAnAAAAEQAAAA8AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABUAAAHZAAAAJwAAABEAAAAPAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAVAAAB2QAAACcAAAARAAAADwAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFgAAAA8AAAANAAAADQAAABYAAAAPAAAADQAAAA0AAAAWAAAADwAAAA0AAAANAAAAFQAAAYwAAAAUc3RjbwAAAAAAAAABAAAAMAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTguNTEuMTAx\" type=\"video/mp4\" />\n",
       "                 </video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Animate learned policy\n",
    "save_dir='./videos/pytorch/6_2/'\n",
    "env = make_env(env_name)\n",
    "generate_animation(env, agent, save_dir=save_dir)\n",
    "[filepath] = glob.glob(os.path.join(save_dir, '*.mp4'))\n",
    "display_animation(filepath)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#TODO\n",
    "\n",
    "# Try to run this on another environment of your choice from OpenAI Gym\n",
    "# read the accompanying text and try to enahnce the network using various variants\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Summary\n",
    "\n",
    "In this notebook we saw how to train a DQN agent with experience replay and target networks to play Atari game. If you have access to a GPU, try to train the agent and see how well it plays. We can improve the agent further with many tricks and there are many more papers detailing such attempts. As we go along, we will be implementing many of these variants."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
